package com.tanger.pay.wechat;

import lombok.Data;

/**
 * @Description 退款参数构造
 * @Author Hchenbin
 * @Date 2024-01-04 17:06
 * @Version 1.0
 */
@Data
public class WeChatRefund {

    /*
    必填
     */
    private String appId;//微信分配的公众账号ID（企业号corpid即为此appId）
    private String mchId;//微信支付分配的商户号
    private String nonceStr;//随机字符串，不长于32位。推荐随机数生成算法
    private String sign;//签名，详见签名生成算法
    private String transactionId;//微信生成的订单号，在支付通知中有返回
    private String outTradeNo;//商户系统内部订单号，要求32个字符内，只能是数字、大小写字母_-|*@ ，且在同一个商户号下唯一。transaction_id、out_trade_no二选一，如果同时存在优先级：transaction_id> out_trade_no
    private String outRefundNo;//商户系统内部的退款单号，商户系统内部唯一，只能是数字、大小写字母_-|*@ ，同一退款单号多次请求只退一笔。
    private String totalFee;//订单总金额，单位为分，只能为整数，详见支付金额
    private String refundFee;//退款总金额，订单总金额，单位为分，只能为整数，详见支付金额

    /*
    非必填
     */
    private String signType;//签名类型，目前支持HMAC-SHA256和MD5，默认为MD5
    private String refundFeeType;//退款货币类型，需与支付一致，或者不填。符合ISO 4217标准的三位字母代码，默认人民币：CNY，其他值列表详见货币类型
    private String refundDesc;//若商户传入，会在下发给用户的退款消息中体现退款原因。注意：若订单退款金额≤1元，且属于部分退款，则不会在退款消息中体现退款原因
    private String refundAccount;//仅针对老资金流商户使用
    private String notifyUrl;//异步接收微信支付退款结果通知的回调地址，通知URL必须为外网可访问的url，不允许带参数。如果参数中传了notify_url，则商户平台上配置的回调地址将不会生效。

    private WeChatRefund(Builder builder) {
        this.appId = builder.appId;
        this.mchId = builder.mchId;
        this.nonceStr = builder.nonceStr;
        this.sign = builder.sign;
        this.signType = builder.signType;
        this.transactionId = builder.transactionId;
        this.outTradeNo = builder.outTradeNo;
        this.outRefundNo = builder.outRefundNo;
        this.totalFee = builder.totalFee;
        this.refundFee = builder.refundFee;
        this.refundFeeType = builder.refundFeeType;
        this.refundDesc = builder.refundDesc;
        this.refundAccount = builder.refundAccount;
        this.notifyUrl = builder.notifyUrl;
    }

    /**
     * @Description 基础构造
     */
    public static Builder basic() {
        Builder builder = new Builder();
        return builder
                .appId(WeChatPayConfig.appId)
                .mchId(WeChatPayConfig.mchId)
                .notifyUrl(WeChatPayConfig.notifyUrl)
                .nonceStr(WeChatUtil.randomStr());
    }

    /**
     * @Description: 基础构造器
     */
    public static Builder refund() {
        return basic();
    }



    public static class Builder {
        /*
        必填
        */
        private String appId;//微信分配的公众账号ID（企业号corpid即为此appId）
        private String mchId;//微信支付分配的商户号
        private String nonceStr;//随机字符串，不长于32位。推荐随机数生成算法
        private String sign;//签名，详见签名生成算法
        private String signType;//签名类型，目前支持HMAC-SHA256和MD5，默认为MD5
        private String transactionId;//微信生成的订单号，在支付通知中有返回
        private String outTradeNo;//商户系统内部订单号，要求32个字符内，只能是数字、大小写字母_-|*@ ，且在同一个商户号下唯一。transaction_id、out_trade_no二选一，如果同时存在优先级：transaction_id> out_trade_no
        private String outRefundNo;//商户系统内部的退款单号，商户系统内部唯一，只能是数字、大小写字母_-|*@ ，同一退款单号多次请求只退一笔。
        private String totalFee;//订单总金额，单位为分，只能为整数，详见支付金额
        private String refundFee;//退款总金额，订单总金额，单位为分，只能为整数，详见支付金额

        /*
        非必填
         */
        private String refundFeeType;//退款货币类型，需与支付一致，或者不填。符合ISO 4217标准的三位字母代码，默认人民币：CNY，其他值列表详见货币类型
        private String refundDesc;//若商户传入，会在下发给用户的退款消息中体现退款原因。注意：若订单退款金额≤1元，且属于部分退款，则不会在退款消息中体现退款原因
        private String refundAccount;//仅针对老资金流商户使用
        private String notifyUrl;//异步接收微信支付退款结果通知的回调地址，通知URL必须为外网可访问的url，不允许带参数。如果参数中传了notify_url，则商户平台上配置的回调地址将不会生效。

        public Builder appId(String appId) {
            this.appId = appId;
            return this;
        }

        public Builder mchId(String mchId) {
            this.mchId = mchId;
            return this;
        }

        public Builder nonceStr(String nonceStr) {
            this.nonceStr = nonceStr;
            return this;
        }

        public Builder sign(String sign) {
            this.sign = sign;
            return this;
        }

        public Builder signType(String signType) {
            this.signType = signType;
            return this;
        }

        public Builder transactionId(String transactionId) {
            this.transactionId = transactionId;
            return this;
        }

        public Builder outTradeNo(String outTradeNo) {
            this.outTradeNo = outTradeNo;
            return this;
        }

        public Builder outRefundNo(String outRefundNo) {
            this.outRefundNo = outRefundNo;
            return this;
        }

        public Builder totalFee(String totalFee) {
            this.totalFee = totalFee;
            return this;
        }

        public Builder refundFee(String refundFee) {
            this.refundFee = refundFee;
            return this;
        }

        public Builder refundFeeType(String refundFeeType) {
            this.refundFeeType = refundFeeType;
            return this;
        }

        public Builder refundDesc(String refundDesc) {
            this.refundDesc = refundDesc;
            return this;
        }

        public Builder refundAccount(String refundAccount) {
            this.refundAccount = refundAccount;
            return this;
        }

        public Builder notifyUrl(String notifyUrl) {
            this.notifyUrl = notifyUrl;
            return this;
        }

        public WeChatRefund build() {
            return new WeChatRefund(this);
        }
    }


}
